﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Lớp Từ Khóa Địa Điểm DAO 
    /// \author Dương Văn Phong -   0912334.
    /// \details <h3>Cung cấp hàm Lấy danh sách từ khóa Địa Điểm với chuỗi tương ứng và autocomplete</h3>
    public class LocationKeyDAO : KeyWordDAO, IKeyWordObjectDAO
    {
        /////////////////////////////////////////////////
        /// \brief Lấy DS LocationKeyDTO
        /// \param[in] Không.
        /// \returns  List<LocationKeyDTO>.
        /// \details <h3>Trả về danh sách tất cả các LocationKeyDTO trong Database.</h3>
        /////////////////////////////////////////////////
        public static List<LocationKeyDTO> GetAllDTOKeyWord()
        {
            List<LocationKeyDTO> lstLocationKey = new List<LocationKeyDTO>();
            var lstResultKey = from data in DataConnectionHelper.Context.TUKHOADIADIEMs
                               select data;

            foreach (var obj in lstResultKey)
            {
                LocationKeyDTO temp = new LocationKeyDTO();
                if (null != obj.MaTenDiaDiem)
                    temp.LocationID = (int)obj.MaTenDiaDiem;
                temp.LocationKeyID = obj.MaTuKhoaTenDiaDiem;
                if (obj.TuKhoaTenDiaDiem != null)
                    temp.LocationKeyWord = obj.TuKhoaTenDiaDiem;
                lstLocationKey.Add(temp);
            }

            return lstLocationKey;
        }
        /////////////////////////////////////////////////
        /// \brief Hàm Chuyển Đổi
        /// \param[in] List<TUKHOADIADIEM> 
        /// \returns List<KeyWordDTO>
        /// \details <h3>Trả về danh sách Đối tượng DTO tương ứng từ database </h3>
        /////////////////////////////////////////////////
        public static List<KeyWordDTO> ConvertToLocationKeyDTOList(List<LocationKeyDTO> locationKeyList)
        {
            List<KeyWordDTO> lstTuKhoaTinhThanhDTO = new List<KeyWordDTO>();
            foreach (LocationKeyDTO tuKhoaDiaDiem in locationKeyList)
            {
                /*LocationKeyDTO locationKey = new LocationKeyDTO();
                locationKey.LocationID = Convert.ToInt32(tuKhoaDiaDiem.MaTenDiaDiem);
                locationKey.LocationKeyID = Convert.ToInt32(tuKhoaDiaDiem.MaTuKhoaTenDiaDiem);
                locationKey.LocationKeyWord = tuKhoaDiaDiem.TuKhoaTenDiaDiem;*/
                lstTuKhoaTinhThanhDTO.Add(tuKhoaDiaDiem);
            }

            return lstTuKhoaTinhThanhDTO;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm Tìm danh sách từ khóa địa điểm với chuỗi tương ứng
        /// \param[in] string
        /// \returns List<KeyWordDTO>
        /// \details <h3>Các bước thực hiện:</h3>
        /////////////////////////////////////////////////
        public List<KeyWordDTO> Search(string strInput)
        {
            /// - Bước 1: Khởi tạo danh sách dữ liệu       
            /// - Bước 1: Khởi tạo danh sách dữ liệu
            List<LocationKeyDTO> lstTuKhoaDiaDiem = new List<LocationKeyDTO>();
            //List<LocationKeyDTO> lstTuKhoaDiaDiemDTO = new List<LocationKeyDTO>();

            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");

                /// - Bước 2: Truy Vấn dữ liệu
                lstTuKhoaDiaDiem = (
                    from emp in SearchHelper.LocationKeys
                    where  string.Empty != emp.LocationKeyWord && strInput.IndexOf(emp.LocationKeyWord) != -1
                    select emp).ToList();
            }

            /// \see ConvertToLocationKeyDTOList(List<TUKHOADIADIEM>)
            return LocationKeyDAO.ConvertToLocationKeyDTOList(lstTuKhoaDiaDiem);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm AutoComplete Tu khoa dia điểm 
        /// \param[in] string
        /// \returns List<KeyWordDTO>
        /// \details <h3>Tìm 10 từ khóa địa điểm đầu tiên khi biết chuỗi con mà nó chứa</h3>
        /////////////////////////////////////////////////
        public List<KeyWordDTO> AutoCompleteTuKhoaDiaDiem(string strInput)
        {
            List<LocationKeyDTO> lstTuKhoaDiaDiem = new List<LocationKeyDTO>();
            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");

                lstTuKhoaDiaDiem = (from emp in SearchHelper.LocationKeys
                                    where emp.LocationKeyWord.Contains(strInput)
                                    orderby emp.LocationID descending
                                    select emp).Distinct().Take(10).ToList();
            }

            /// \see ConvertToLocationKeyDTOList(List<TUKHOADIADIEM>)
            return LocationKeyDAO.ConvertToLocationKeyDTOList(lstTuKhoaDiaDiem);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm AutoComplete Tu khoa dia điểm theo dịch vụ 
        /// \param[in] string
        /// \param[in] int
        /// \returns List<KeyWordDTO>
        /// \details <h3>Tìm 10 từ khóa địa điểm đầu tiên thuộc 1 loại dịch vụ khi biết chuỗi con mà nó chứa  </h3>
        public List<KeyWordDTO> AutoCompleteTuKhoaDiaDiemTheoDichVu(string strInput, int maDichVu)
        {
            List<LocationKeyDTO> listTuKhoaDiaDiem = new List<LocationKeyDTO>();
            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");
                listTuKhoaDiaDiem = (from kdd in SearchHelper.LocationKeys
                                     join dd in SearchHelper.Locations on kdd.LocationID equals
                                         dd.LocationID
                                     join dl in SearchHelper.Datas on dd.LocationID equals
                                         dl.MaTenDiaDiem
                                     where kdd.LocationKeyWord.Contains(strInput) == true && dl.MaDichVu == maDichVu
                                     orderby kdd.LocationKeyWord descending
                                     select kdd).Distinct().Take(10).ToList();
            }

            /// \see ConvertToLocationKeyDTOList(List<TUKHOADIADIEM>)
            return LocationKeyDAO.ConvertToLocationKeyDTOList(listTuKhoaDiaDiem);
        }
    }
}
